package com.niit.session21;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.sql.Savepoint;

import com.niit.session20.JDBCUtils;

public class ATM {
	public static void main(String[] args) {
		try {
			transfer();
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}
	
	
	
	public static void transfer() throws SQLException {
		Connection conn = JDBCUtils.getConn();
//		关闭自动事务提交
		conn.setAutoCommit(false);
//		扣除我账号中的余额
		PreparedStatement ps = conn.prepareStatement("update user set balance = balance -500 where id =1");
		int update = ps.executeUpdate();
//		关闭自动事务提交之后，如果代码执行过程中出现了任何的异常，所有的更新操作都不会生效，只有所有代码执行成功，并且执行了commit()方法之后才会生效
//		System.out.println(1/0);
//		让对方的余额增加500
		PreparedStatement ps1 = conn.prepareStatement("update user set balance = balance +500 where id =2");
		int update2 = ps1.executeUpdate();
//		设置一个保存点
		Savepoint save1 = conn.setSavepoint();
		PreparedStatement ps2 = conn.prepareStatement("update user set balance = balance +500 where id =2");
		int update3 = ps2.executeUpdate();
//		回滚到指定的保存点，回滚之后保存点之后的更新语句不会生效
		conn.rollback(save1);
//		提交事务,如果关闭了自动的事物管理，又不提交事务，前面所有的修改都会不生效
		conn.commit();
		if(update>0 && update2 > 0) {
			System.out.println("更新成功");
		}
		
		
		
	}

}
